const dayjs = require('dayjs');
/**
 * 文件数据模型
 */
class FileModel {
    // 集合名
    static COLLECTION_NAME = 'plm_file';

    // 字段前缀
    static FIELD_PREFIX = 'FILE_';

    // 字段定义
    static FIELD = {
        PROJECT_ID: 'projectId', // 项目ID
        NAME: 'name', // 文件名
        TYPE: 'type', // 文件类型
        TAG: 'tag', // 文件标签
        DESC: 'desc', // 文件描述
        FILE_ID: 'fileID', // 云存储文件ID
        SIZE: 'size', // 文件大小
        CREATE_TIME: 'createTime', // 创建时间
        UPDATE_TIME: 'updateTime', // 更新时间
        CREATE_BY: 'createBy', // 创建者ID
        CREATE_NAME: 'createName', // 创建者名称
        STATUS: 'status', // 状态 1-有效 0-无效
        VERSION: 'version', // 版本号
        SORT: 'sort', // 排序号
        VIEW_COUNT: 'viewCount', // 查看次数
        DOWNLOAD_COUNT: 'downloadCount' // 下载次数
    };

    /**
     * 获取字段名称
     * @param {String} key 字段键名
     * @returns {String} 完整字段名
     */
    static getFieldName(key) {
        return this.FIELD_PREFIX + key;
    }

    /**
     * 校验文件数据
     * @param {Object} data 文件数据
     * @returns {String} 错误信息，如果没有错误则返回空字符串
     */
    static validateFileData(data) {
        if (!data) return '数据不能为空';
        
        if (!data.projectId && !data.PROJECT_ID) return '项目ID不能为空';
        if (!data.name && !data.NAME) return '文件名不能为空';
        if (!data.fileID && !data.FILE_ID) return '文件ID不能为空';
        
        return '';
    }

    /**
     * 格式化文件数据
     * @param {Object} data 原始数据
     * @param {Boolean} isFull 是否返回完整数据
     * @returns {Object} 格式化后的数据
     */
    static formatFileData(data, isFull = true) {
        if (!data) return null;
        
        // 基础数据
        const file = {
            _id: data._id,
            projectId: data.projectId || data[this.FIELD.PROJECT_ID] || '',
            name: data.name || data[this.FIELD.NAME] || '',
            type: data.type || data[this.FIELD.TYPE] || '',
            tag: data.tag || data[this.FIELD.TAG] || '',
            desc: data.desc || data[this.FIELD.DESC] || '',
            fileID: data.fileID || data[this.FIELD.FILE_ID] || '',
            size: data.size || data[this.FIELD.SIZE] || 0,
            createTime: data.createTime || data[this.FIELD.CREATE_TIME],
            updateTime: data.updateTime || data[this.FIELD.UPDATE_TIME],
            createBy: data.createBy || data[this.FIELD.CREATE_BY] || '',
            createName: data.createName || data[this.FIELD.CREATE_NAME] || '',
            status: data.status || data[this.FIELD.STATUS] || 1,
            version: data.version || data[this.FIELD.VERSION] || 1,
            sort: data.sort || data[this.FIELD.SORT] || 9999,
            viewCount: data.viewCount || data[this.FIELD.VIEW_COUNT] || 0,
            downloadCount: data.downloadCount || data[this.FIELD.DOWNLOAD_COUNT] || 0
        };
        
        // 如果不需要完整数据，则返回基础数据
        if (!isFull) return file;
        
        // 添加其他格式化数据
        const createTimeDesc = file.createTime ? dayjs(file.createTime).format("YYYY-MM-DD HH:mm:ss") : '';
        const updateTimeDesc = file.updateTime ? dayjs(file.updateTime).format("YYYY-MM-DD HH:mm:ss") : '';
        
        return {
            ...file,
            createTimeDesc,
            updateTimeDesc,
            statusDesc: file.status === 1 ? '有效' : '无效'
        };
    }

    /**
     * 格式化文件列表
     * @param {Array} list 原始列表数据
     * @param {Boolean} isFull 是否返回完整数据
     * @returns {Array} 格式化后的列表
     */
    static formatFileList(list, isFull = false) {
        if (!Array.isArray(list)) return [];
        return list.map(item => this.formatFileData(item, isFull));
    }

    /**
     * 获取支持的文件类型列表
     * @returns {Array} 文件类型列表
     */
    static getSupportFileTypes() {
        return [
            { value: 'image', label: '图片', exts: ['jpg', 'jpeg', 'png', 'gif'] },
            { value: 'doc', label: '文档', exts: ['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'pdf', 'txt'] },
            { value: 'zip', label: '压缩包', exts: ['zip', 'rar', '7z'] },
            { value: 'other', label: '其他', exts: [] }
        ];
    }

    /**
     * 根据文件扩展名获取文件类型
     * @param {String} fileName 文件名
     * @returns {String} 文件类型
     */
    static getFileTypeByExt(fileName) {
        if (!fileName) return 'other';
        
        const ext = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();
        const types = this.getSupportFileTypes();
        
        for (const type of types) {
            if (type.exts.includes(ext)) {
                return type.value;
            }
        }
        
        return 'other';
    }
}

module.exports = FileModel; 